/**
 * 
 */
package com.slink.xin.common.dao;

import java.lang.reflect.ParameterizedType;

import javax.annotation.PostConstruct;

import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

/** 
 * @ClassName: BaseDao 
 * @Description: TODO
 * @author 新
 * @date 2015年10月22日 上午9:30:04 
 *  
 */

public abstract class BaseDao<T> extends SqlSessionDaoSupport {

	//保护类型，子类可直接访问
	protected T mapper;

	@Autowired
	@Qualifier("sqlSessionTemplate")
	@Override
	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
		super.setSqlSessionTemplate(sqlSessionTemplate);
	}
	
	@PostConstruct
	public void init()
	{
		//在init方法被通过子类（如StudentDao）的对象被调用时，this
		//指代的是子类的对象，this.getClass()返回代表子类的Class对象，
		//再接着调用getGenericSuperclass()方法，可以返回代表子类的直接
		//超类（也就是BaseDao类）的Type对象。因为它是泛型，因此可强制类型
		//转换为ParameterizedType类型，再调用getActualTypeArguments()
		//方法，可获得子类给泛型指定的实际类型的数组。因为这里只有一个泛型
		//参数，所以取数组的第0个元素，即为子类的映射器类型。变量mapperType
		//代表子类的映射器类型。
		@SuppressWarnings("unchecked")
		Class<T> mapperType = (Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		System.out.println("初始化..." + "   " + mapperType.getName());
		//初始化映射器属性
		this.mapper = this.getSqlSession().getMapper(mapperType);
	}
	
}
